﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Reflection;
using System.IO;
using System.Diagnostics;
using System.Globalization;
//- Справочник для каталогов товара, возможность добавить, ДМ
namespace template_dll
{
    public partial class ChildForm : Form
    {
        public ChildForm()
        {
            InitializeComponent();
        }
        public DataTable dt_catalog = new DataTable();          //- для вывода на форму
        private const string namechcol = "Флаг";
        private SqlConnection conn;
        private DataTable dt_rep;
        public DataTable[] dt_ret = new DataTable[2];
        private delegate void Deleg();
        private Deleg del;
        public DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn(); //-  для вывода на гриде комбобоксов        
        public string group;
        public static bool DisplayForm(System.Windows.Forms.Form theMDIParent)
        {
            ChildForm f = new ChildForm();
            f.MdiParent = theMDIParent;
            f.WindowState = FormWindowState.Maximized;
            f.Show();
            return true;
        }
        public class cMain
        {
            public static Control Form1Control = null;
            private cMain() { }
        }

        public string GetServ(string filename)
        {
            string str = "";
            using (StreamReader streamReader = new StreamReader(filename))
            {
                while (!streamReader.EndOfStream)
                {
                    str += streamReader.ReadLine();
                }
            }
            return str;
        }

        private void ChildForm_Load(object sender, EventArgs e)
        {
            cMain.Form1Control = this;
            conn = new SqlConnection(@"Server=" + GetServ("serv.txt") + ";Database=ToolsDM;Integrated Security=True");
            SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[1];
            par[0].name = "@pointer";
            par[0].value = 2;
            dt_catalog.Columns.Add("Код товара");
            dt_catalog.Columns.Add("Наименование товара");
            dt_catalog.Columns.Add("Учётная цена");
            dt_catalog.Columns.Add("Группа каталога");
            dataGridView1.DataSource = dt_catalog.DefaultView;
            dt_ret = (new SqlStorProc()).SqlProcExecWithQuery(conn, "pas_FillAttributesDrugs", 300, par);
            //cmb.Name = "Группа каталога";
            //cmb.Width = 250;
            //cmb.DataSource = dt_ret[0];
            //cmb.DataPropertyName = "id";
            //cmb.DisplayMember = "NameGroup";            // столбец для отображения
            //cmb.ValueMember = "NameGroup";
            //dataGridView1.Columns.Add(cmb);
        }

        private void StartCreateRep(object sender, EventArgs e)
        {
            dataGridView1.DataSource = null;
            dt_rep.Clear();
            del = new Deleg(CreateRep);
            this.Text += " Формируется";
            IAsyncResult asyncRes = del.BeginInvoke(new AsyncCallback(CallBackFunc), null); 
            panel1.Enabled = false;
            dataGridView1.Enabled = false;
        }

        private void CallBackFunc(IAsyncResult aRes)
        {
            del.EndInvoke(aRes);
            panel1.Invoke((Func<bool>)(() => panel1.Enabled = true));
            dataGridView1.Invoke((Func<bool>)(() => dataGridView1.Enabled = true));
            this.Invoke((Func<string>)(() => this.Text = this.Text.Replace(" Формируется", "")));
            dataGridView1.Invoke((Func<object>)(() => dataGridView1.DataSource = dt_rep.DefaultView));
        }

        private void CreateRep()
        {
            if (conn.State == ConnectionState.Closed) conn.Open();
            try
            {
                dt_rep.Load(RepProc(conn));
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                conn.Close();
            }

        }

        private SqlDataReader RepProc(SqlConnection sqlcon)//метод для вызова хранимки
        {
            SqlCommand sqlcom = sqlcon.CreateCommand();
            sqlcom.CommandType = CommandType.StoredProcedure;
            sqlcom.CommandText = @"sp_name"; //имя хранимой процедуры
            sqlcom.CommandTimeout = 300;
            return sqlcom.ExecuteReader();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //- Загрузить из Excel файла
            dataGridView1.DataSource = null;
            dt_catalog = null;
            dt_catalog = new DataTable();
            ExpToExcel ex = new ExpToExcel();
            ex.ImportExcel(dt_catalog);
            if (dt_catalog.Rows.Count == 0)
            {
                MessageBox.Show("Не выбран файл");
                return;
            }
            if (dataGridView1.Columns.Count > 0)
            {
                dataGridView1.Columns.Remove("Группа каталога");
            }

            dataGridView1.DataSource = dt_catalog.DefaultView;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //- Вывести в Excel файл
            ExpToExcel ex = new ExpToExcel();
            ex.ExportToExcel(dataGridView1);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //- Фильтр по товару
            DrugsFilter.DrugsFilter df = new DrugsFilter.DrugsFilter();
            dataGridView1.DataSource = null;
            this.Text += " Загрузка товара";
            df.ShowDialog();
            this.Text = this.Text.Replace(" Загрузка товара", "");
            if (df.dt_drug_tmp.Rows.Count > 0)
            {
                dt_catalog.Clear();
                df.dt_drug_tmp.Columns.Remove("Флаг");
                df.dt_drug_tmp.Columns.Remove("Страна");
                df.dt_drug_tmp.Columns.Remove("Производитель");
                df.dt_drug_tmp.Columns.Remove("Группа заказа");
                df.dt_drug_tmp.Columns.Remove("Спецгруппа");
                df.dt_drug_tmp.Columns.Remove("Обязательный ассортимент");
                df.dt_drug_tmp.Columns.Remove("Категория");
                df.dt_drug_tmp.Columns.Remove("Отделение");
                df.dt_drug_tmp.Columns.Remove("МНН");
                df.dt_drug_tmp.Columns.Remove("Торговая технология");
                df.dt_drug_tmp.Columns.Remove("Акция");
                df.dt_drug_tmp.Columns.Remove("Архивный");
                dt_catalog = df.dt_drug_tmp.Copy();
                foreach (DataColumn col in dt_catalog.Columns)
                {
                    if (col.ColumnName == "Группа каталога")
                    {
                        dt_catalog.Columns.Remove(col);
                    }
                }
                dt_catalog.Columns["Контрагент"].ColumnName = "Группа каталога";
                //int cc = 0;
                //for (cc = 0; cc < dt_catalog.Rows.Count; cc++)
                //{
                //    DataTable tbl = new DataTable();
                //    DataColumn col = dt_catalog.Columns["Учётная цена"];
                //    SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[1];
                //    par[0].name = "@pointer";
                //    par[0].value = Convert.ToInt32(dt_catalog.Rows[cc]["Код товара"].ToString());
                //    tbl = (new SqlStorProc()).SqlProcExecWithQueryOneTable(conn, "pas_FillAttributesDrugs", 300, par);
                //}
                foreach (DataColumn col in dt_catalog.Columns)
                {
                    col.AllowDBNull = true;
                    col.ReadOnly = false;
                }
                dataGridView1.DataSource = dt_catalog.DefaultView;
                dataGridView1.Columns["Учётная цена"].DefaultCellStyle.Format = "N1";
                //int j = 0;
                //for (j = 0; j < dataGridView1.Columns.Count; j++)
                //{
                //    if (dataGridView1.Columns[j].Name == "Группа каталога")
                //    {
                //        dataGridView1.Columns.RemoveAt(j);
                //    }
                //}
                //if (dataGridView1.Columns[0] != cmb)
                //{
                //    dataGridView1.Columns.Add(cmb);
                //}

                //- для разрешения значений NULL в таблице
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            //- Добавить новую группу каталога
            this.Enabled = false;
            Form3 form = new Form3();
            form.ShowDialog();
        }

        private void button6_Click(object sender, EventArgs e)
        {
            //- Загрузить в базу информацию
            try
            {
                if (dataGridView1.Rows.Count == 0)
                {
                    MessageBox.Show("Нет данных для загрузки");
                    return;
                }
                if (dataGridView1.Columns[0] == cmb)
                {
                    int rezult;                                         //- результат занесения в базу
                    SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[2];
                    DataTable dt_par = new DataTable();
                    dt_par.Columns.Add("Код товара");
                    dt_par.Columns.Add("Группа каталога");
                    dt_par.Columns.Add("Учётная цена");
                    foreach (DataGridViewRow dr in dataGridView1.Rows)
                    {
                        if (dr.Cells[0].Value == null)
                        {
                            MessageBox.Show("Не введено значение группы, строка " + (dr.Index + 1).ToString());
                            return;
                        }
                        dt_par.Rows.Add(Convert.ToInt32(dr.Cells["Код товара"].Value.ToString()), dr.Cells["Группа каталога"].Value, dr.Cells["Учётная цена"].Value);
                   }
                    par[0].name = "@i";
                    par[0].value = null;
                    par[1].name = "@tbl";
                    par[1].value = dt_par;
                    SqlStorProc sqll = new SqlStorProc();
                    rezult = sqll.SqlProcExecNonQuery(conn, "pas_InsertDrugGroup", 300, par);
                    if (rezult > 0)
                    {
                        MessageBox.Show("Информация внесена в базу");
                    }
                    else MessageBox.Show("Информация НЕ внесена в базу");
                }
                else
                {
                    int rezult;                                         //- результат занесения в базу
                    SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[2];
                    DataTable dt_par = new DataTable();
                    dt_par.Columns.Add("Группа каталога");
                    dt_par.Columns.Add("Код товара");
                    dt_par.Columns.Add("Учётная цена");
                    foreach (DataGridViewRow dr in dataGridView1.Rows)
                    {
                        if (dr.Cells["Группа каталога"].Value == null || dr.Cells["Группа каталога"].Value.ToString() == "")
                        {
                            MessageBox.Show("Не введено значение группы, строка " + (dr.Index + 1).ToString());
                            return;
                        }
                        dt_par.Rows.Add(Convert.ToInt32(dr.Cells["Код товара"].Value.ToString()), dr.Cells["Группа каталога"].Value, dr.Cells["Учётная цена"].Value);
                    }
                    par[0].name = "@i";
                    par[0].value = null;
                    par[1].name = "@tbl";
                    par[1].value = dt_par;
                    SqlStorProc sqll = new SqlStorProc();
                    rezult = sqll.SqlProcExecNonQuery(conn, "pas_InsertDrugGroup", 300, par);
                    if (rezult > 0)
                    {
                        MessageBox.Show("Информация внесена в базу");
                    }
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show("Информация в базу не внесена " + ex.ToString()); 
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            //- Вывести список групп в Excel файл 
            ExpToExcel ex = new ExpToExcel();
            ex.ExportToExcel(dt_ret[0]);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            //- Поместить товар в группу
            this.Enabled = false;
            Form2 form = new Form2();
            form.ShowDialog();
        }
        public void refreshData()
        {
            //- Обновить дата грид
            int i = 0;
            for(i=0;i< dataGridView1.Columns.Count; i++)
            {
                if (dataGridView1.Columns[i].Name == "Группа каталога")
                {
                    dataGridView1.Columns.RemoveAt(i);
                    break;
                }
            }
            dataGridView1.Columns.Add("Группа каталога", "Группа каталога");
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                row.Cells["Группа каталога"].Value = group;
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            //- Загрузить в базу информацию
            try
            {
                if (dataGridView1.Rows.Count == 0)
                {
                    MessageBox.Show("Нет данных для загрузки");
                    return;
                }
                if (dataGridView1.Columns[0] == cmb)
                {
                    int rezult;                                         //- результат занесения в базу
                    SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[2];
                    DataTable dt_par = new DataTable();
                    dt_par.Columns.Add("Группа каталога");
                    dt_par.Columns.Add("Код товара");
                    dt_par.Columns.Add("Учётная цена");
                    foreach (DataGridViewRow dr in dataGridView1.Rows)
                    {
                        if (dr.Cells["Группа каталога"] == null)
                        {
                            MessageBox.Show("Не введено значение группы, строка " + (dr.Index + 1).ToString());
                            return;
                        }
                        dt_par.Rows.Add(Convert.ToInt32(dr.Cells["Код товара"].Value.ToString()), dr.Cells["Группа каталога"].Value, dr.Cells["Учётная цена"].Value);
                    }
                    par[0].name = "@i";
                    par[0].value = 100;
                    par[1].name = "@tbl";
                    par[1].value = dt_par;
                    SqlStorProc sqll = new SqlStorProc();
                    rezult = sqll.SqlProcExecNonQuery(conn, "pas_InsertDrugGroup", 300, par);
                    if (rezult > 0)
                    {
                        MessageBox.Show("Информация внесена в базу");
                    }
                    else MessageBox.Show("Информация НЕ внесена в базу");
                }
                else
                {
                    int rezult;                                         //- результат занесения в базу
                    SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[2];
                    DataTable dt_par = new DataTable();
                    dt_par.Columns.Add("Группа каталога");
                    dt_par.Columns.Add("Код товара");
                    dt_par.Columns.Add("Учётная цена");
                    foreach (DataGridViewRow dr in dataGridView1.Rows)
                    {
                        if (dr.Cells["Группа каталога"].Value == null || dr.Cells["Группа каталога"].Value.ToString() == "")
                        {
                            MessageBox.Show("Не введено значение группы, строка " + (dr.Index + 1).ToString());
                            return;
                        }
                        dt_par.Rows.Add(Convert.ToInt32(dr.Cells["Код товара"].Value.ToString()), dr.Cells["Группа каталога"].Value, dr.Cells["Учётная цена"].Value);
                    }
                    par[0].name = "@i";
                    par[0].value = 100;
                    par[1].name = "@tbl";
                    par[1].value = dt_par;
                    SqlStorProc sqll = new SqlStorProc();
                    rezult = sqll.SqlProcExecNonQuery(conn, "pas_InsertDrugGroup", 300, par);
                    if (rezult > 0)
                    {
                        MessageBox.Show("Информация внесена в базу");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Информация в базу не внесена " + ex.ToString());
            }
        }

        private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            //- Удаление товара двойным щелчком
            if (dataGridView1.CurrentRow.Cells["Группа каталога"].Value.ToString() == null || dataGridView1.CurrentRow.Cells["Группа каталога"].Value.ToString() == "")
            {
                MessageBox.Show("Выбранный товар не в группе");
                return;
            }
            else
            {
                DialogResult ret = new DialogResult();
                ret = MessageBox.Show("Удалить товар из группы?", "Удаление товара из группы", MessageBoxButtons.YesNo);
                if (ret == DialogResult.Yes)
                {
                    int rezult = -1;
                    SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[2];
                    par[0].name = "@drCode";
                    par[0].value = Convert.ToInt32(dataGridView1.CurrentRow.Cells["Код товара"].Value.ToString());
                    par[1].name = "@grName";
                    par[1].value = dataGridView1.CurrentRow.Cells["Группа каталога"].Value.ToString();
                    rezult = (new SqlStorProc()).SqlProcExecNonQuery(conn, "pas_DestroyDrug", 300, par);
                    if (rezult == -1 || rezult == 0)
                    {
                        MessageBox.Show("Не удалось удалить товар");
                    }
                    else if (rezult == 1)
                    {
                        dataGridView1.Rows.Remove(dataGridView1.CurrentRow);
                        MessageBox.Show("Товар удалён");
                    }
                }
            }
        }
    }
}
